from xen.xend.XendAPIConstants import *
+from types import *
+
+def _stringify(value):
+ if isinstance(value, IntType) and not isinstance(value, BooleanType):
+ return str(value)
+ elif isinstance(value, DictType):
+ for k, v in value.items():
+ value[k] = _stringify(v)
+ return value
+ elif isinstance(value, (TupleType, ListType)):
+ return [_stringify(v) for v in value]
+ else:
+ return value
+
def xen_api_success(value):
- return {"Status": "Success", "Value": value}
+ return {"Status": "Success", "Value": _stringify(value)}
+
def xen_api_success_void():
"""Return success, but caller expects no return value."""
return xen_api_success("")
def get_vcpus_params(self):
return '' # TODO
def get_power_state(self):
- return self.state
+ return XEN_API_VM_POWER_STATE[self.state]
def get_tpm_instance(self):
return '' # TODO
def get_tpm_backend(self):
def get_builder(self):
return 'Linux' # TODO
def get_boot_method(self):
- return self.info['bootloader']
+ bootloader = self.info['bootloader']
+ if not bootloader or bootloader not in XEN_API_BOOT_TYPE:
+ return 'kernel_external'
+ return bootloader
+
def get_kernel_image(self):
return self.info['kernel_kernel']
def get_kernel_initrd(self):
return {} # TODO
def get_on_shutdown(self):
- try:
- return XEN_API_ON_NORMAL_EXIT.index(self.info['on_poweroff'])
- except ValueError, e:
- return XEN_API_ON_NORMAL_EXIT.index('restart')
-
+ after_shutdown = self.info.get('on_poweroff')
+ if not after_shutdown or after_shutdown not in XEN_API_ON_NORMAL_EXIT:
+ return XEN_API_ON_NORMAL_EXIT[-1]
+ return after_shutdown
+
def get_on_reboot(self):
- try:
- return XEN_API_ON_NORMAL_EXIT.index(self.info['on_reboot'])
- except ValueError, e:
- return XEN_API_ON_NORMAL_EXIT.index('restart')
+ after_reboot = self.info.get('on_reboot')
+ if not after_reboot or after_reboot not in XEN_API_ON_NORMAL_EXIT:
+ return XEN_API_ON_NORMAL_EXIT[-1]
+ return after_reboot
def get_on_suspend(self):
- return 0 # TODO
+ after_suspend = self.info.get('on_suspend') # TODO: not supported
+ if not after_suspend or after_suspend not in XEN_API_ON_NORMAL_EXIT:
+ return XEN_API_ON_NORMAL_EXIT[-1]
+ return after_suspend
def get_on_crash(self):
- try:
- return XEN_API_ON_CRASH_BEHAVIOUR.index(self.info['on_crash'])
- except ValueError, e:
- return XEN_API_ON_CRASH_BEHAVIOUR.index('destroy')
+ after_crash = self.info.get('on_crash')
+ if not after_crash or after_crash not in XEN_API_ON_CRASH_BEHAVIOUR:
+ return XEN_API_ON_CRASH_BEHAVIOUR[0]
+ return after_crash
def get_dev_config_by_uuid(self, dev_class, dev_uuid):
""" Get's a device configuration either from XendConfig or
from the DevController."""
- if self.get_power_state() in (XEN_API_VM_POWER_STATE_HALTED,):
+ if self.state in (XEN_API_VM_POWER_STATE_HALTED,):
dev = self.info['device'].get(dev_uuid)
if dev:
return dev[1].copy()
config['device'] = config.get('dev', '')
config['driver'] = config.get('uname', '')
config['IO_bandwidth_incoming_kbs'] = 0.0
- config['IO_bandwidth_outgoing_kbs'] = 0.0
+ config['IO_bandwidth_outgoing_kbs'] = 0.0
+ if config['mode'] == 'r':
+ config['mode'] = 'RO'
+ else:
+ config['mode'] = 'RW'
return config
if not dev_uuid:
raise XendError('Failed to create device')
- if self.state in (XEN_API_VM_POWER_STATE_RUNNING,):
+ if self.state in (DOM_STATE_HALTED,):
sxpr = self.info.device_sxpr(dev_uuid)
devid = self.getDeviceController('vif').createDevice(sxpr)
raise XendError("Device creation failed")